package com.basic.business.common.utils.kmUtil;

import com.google.common.collect.Lists;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;

public class RopUtil {

    public static String gettime(){
        String patternStr = "yyyy-MM-dd HH:mm:ss";
        // 北京时间（new出来就是默认时区的时间）
        Date bjDate = new Date();

        // 得到纽约的时区
        TimeZone newYorkTimeZone = TimeZone.getTimeZone("GMT+8");
        // 根据此时区 将北京时间转换为纽约的Date
        DateFormat newYorkDateFormat = new SimpleDateFormat(patternStr);
        newYorkDateFormat.setTimeZone(newYorkTimeZone);
        String format = newYorkDateFormat.format(bjDate);
        return format;
    }

    /**
     * 使用<code>secret</code>对paramValues按以下算法进行签名： <br/>
     * uppercase(hex(sha1(secretkey1value1key2value2...secret))
     *
     * @param paramValues 参数列表
     * @param secret
     * @param signMethod  签名方法，目前支持：空（老md5)、md5, hmac_md5, hmac-sha256 三种
     * @return
     */
    public static String serverSign(Map<String, String> paramValues, String secret, String signMethod) throws Exception {
        return serverSign(paramValues, Lists.newArrayList("logger"), secret, signMethod);
    }

    /**
     * 对paramValues进行签名，其中ignoreParamNames这些参数不参与签名
     *
     * @param paramValues
     * @param ignoreParamNames
     * @param secret
     * @return
     */
    public static String serverSign(Map<String, String> paramValues, List<String> ignoreParamNames, String secret, String signMethod) throws Exception {
        try {
            //去除需要忽略不参与签名的参数
            if (ignoreParamNames != null && ignoreParamNames.size() > 0) {
                for (String ignoreParamName : ignoreParamNames) {
                    paramValues.remove(ignoreParamName);
                }
            }

            String sign;
            if (RopAppSecretSignUtils.SIGN_METHOD_HMAC.equals(signMethod)) {
                sign = RopAppSecretSignUtils.signTopRequest(paramValues, secret, RopAppSecretSignUtils.SIGN_METHOD_HMAC);
            } else if (RopAppSecretSignUtils.SIGN_METHOD_HMAC_SHA256.equals(signMethod)) {
                sign = RopAppSecretSignUtils.signTopRequest(paramValues, secret, RopAppSecretSignUtils.SIGN_METHOD_HMAC_SHA256);
            } else {
                sign = RopAppSecretSignUtils.signTopRequest(paramValues, secret, RopAppSecretSignUtils.SIGN_METHOD_MD5);
            }

            return sign;
        } catch (IOException e) {
            throw new Exception(e);
        }
    }

}
